{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "import random\n",
    "\n",
    "punctuation = '!()&%{}[];:\\'\",./?\\\\<>'\n",
    "\n",
    "def remove_punc(string):\n",
    "    string = re.sub('[^A-Za-z0-9 ]+', ' ', string)\n",
    "    string = re.sub(r'[ ]+', ' ', string).strip()\n",
    "    return string\n",
    "\n",
    "def remove_punc_random(string, threshold = 0.3):\n",
    "    result = []\n",
    "    for c in string:\n",
    "        if c in punctuation and random.random() >= threshold:\n",
    "            continue\n",
    "            \n",
    "        result.append(c)\n",
    "    return ''.join(result)\n",
    "\n",
    "def add_punc_random(string, threshold = 0.7):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold and string[i][-1] not in punctuation:\n",
    "            string[i] = string[i] + random.choice(punctuation)\n",
    "    return ' '.join(string)\n",
    "\n",
    "def add_space_after_punc(string, threshold = 0.3):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold and string[i][-1] in punctuation:\n",
    "            string[i] = string[i][:-1] + ' ' + string[i][-1]\n",
    "    return ' '.join(string)\n",
    "\n",
    "def replace_random_punc(string):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if string[i][-1] in punctuation:\n",
    "            string[i] = string[i][:-1] + random.choice(punctuation)\n",
    "    return ' '.join(string)\n",
    "\n",
    "def random_upper(string, threshold = 0.5):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold:\n",
    "            string[i] = string[i].upper()\n",
    "    return ' '.join(string)\n",
    "\n",
    "def random_title(string, threshold = 0.5):\n",
    "    string = string.split()\n",
    "    for i in range(len(string)):\n",
    "        if random.random() >= threshold:\n",
    "            string[i] = string[i].title()\n",
    "    return ' '.join(string)\n",
    "\n",
    "def random_char_upper(string, threshold = 0.7):\n",
    "    result = []\n",
    "    for c in string:\n",
    "        if random.random() >= threshold:\n",
    "            c = c.upper()\n",
    "        result.append(c)\n",
    "    return ''.join(result)\n",
    "\n",
    "def remove_space(string, threshold = 0.5):\n",
    "    string = [s for s in string if not (s == ' ' and random.random() >= threshold)]\n",
    "    return ''.join(string)\n",
    "\n",
    "funcs = [remove_punc, remove_punc_random, add_punc_random, add_space_after_punc, \n",
    "         random_upper, random_title, random_char_upper, replace_random_punc]\n",
    "\n",
    "chain_funcs = [remove_punc_random, add_punc_random, add_space_after_punc, \n",
    "         random_upper, random_title, random_char_upper, replace_random_punc]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def package(string, repeat = 2, repeat_chain = 5, threshold = 0.5, maintain_space = True):\n",
    "    \n",
    "    result = [string]\n",
    "    result.append(string.lower())\n",
    "    result.append(string.upper())\n",
    "    result.append(string.title())\n",
    "    \n",
    "    for _ in range(repeat):\n",
    "    \n",
    "        for func in funcs:\n",
    "            result.append(func(string))\n",
    "\n",
    "        for func in funcs:\n",
    "            result.append(func(string.lower()))\n",
    "\n",
    "        for func in funcs:\n",
    "            result.append(func(string.upper()))\n",
    "\n",
    "        for func in funcs:\n",
    "            result.append(func(string.title()))\n",
    "    \n",
    "    for _ in range(repeat_chain):\n",
    "        s = string[:]\n",
    "        for func in chain_funcs:\n",
    "            if random.random() > threshold:\n",
    "                s = func(s)\n",
    "        result.append(s)\n",
    "        \n",
    "    result = list(set(result))\n",
    "    if not maintain_space:\n",
    "        result = [remove_space(r) for r in result]\n",
    "        result = list(set(result))\n",
    "        \n",
    "    return [(r, string) for r in result]\n",
    "\n",
    "def slide(strings, n = 2):\n",
    "    result = []\n",
    "    for i in range(0, len(strings), len(strings) - (n - 1)):\n",
    "        result.append(strings[i: i + n])\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "files = ['/home/husein/pure-text/filtered-dumping-wiki.txt',\n",
    "        '/home/husein/pure-text/dumping-cleaned-news.txt',]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "363578"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(files[0]) as fopen:\n",
    "    data = fopen.read().split('\\n')\n",
    "    \n",
    "results, result = [], []\n",
    "for i in data:\n",
    "    if len(i) and i[-1] != '.':\n",
    "        i = i + '.'\n",
    "    if not len(i) and len(result):\n",
    "        results.append(result)\n",
    "        result = []\n",
    "    else:\n",
    "        if len(i):\n",
    "            result.append(i)\n",
    "        \n",
    "if len(result):\n",
    "    results.append(result)\n",
    "    \n",
    "len(results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm import tqdm\n",
    "\n",
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        try:\n",
    "            slided = slide(strings[i])\n",
    "            slided = [s for s in slided if len(s) > 1]\n",
    "            for s in slided:\n",
    "                s = ' '.join(s)\n",
    "                p = package(s)\n",
    "                results.extend(p)\n",
    "        except :\n",
    "            pass\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 12/12 [00:00<00:00, 1524.83it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 1096.86it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 1100.03it/s]\n",
      "\n",
      "100%|██████████| 12/12 [00:00<00:00, 757.53it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 956.86it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 704.21it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 581.81it/s]\n",
      "\n",
      "100%|██████████| 8/8 [00:00<00:00, 714.00it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 535.17it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 530.83it/s]\n",
      "\n",
      "\n",
      "100%|██████████| 12/12 [00:00<00:00, 430.84it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 917.14it/s]\n",
      "100%|██████████| 12/12 [00:00<00:00, 721.59it/s]\n"
     ]
    }
   ],
   "source": [
    "import cleaning\n",
    "\n",
    "results1 = cleaning.multiprocessing(random.sample(results, 200), loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset = []\n",
    "testset.extend(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7428"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(testset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3656919"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(files[1]) as fopen:\n",
    "    data = fopen.read().split('\\n')\n",
    "    \n",
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "results, result = [], []\n",
    "for i in data:\n",
    "    if len(i) and i[-1] != '.':\n",
    "        i = i + '.'\n",
    "    if not len(i) and len(result):\n",
    "        results.append(result)\n",
    "        result = []\n",
    "    else:\n",
    "        if len(i):\n",
    "            result.append(i)\n",
    "        \n",
    "if len(result):\n",
    "    results.append(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6/6 [00:00<00:00, 533.92it/s]\n",
      "\n",
      "\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]5.74it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 406.77it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 362.06it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 409.39it/s]\n",
      "\n",
      "100%|██████████| 4/4 [00:00<00:00, 668.52it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 294.14it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 249.39it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 227.70it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 281.12it/s]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "results = random.sample(results, 100)\n",
    "results1 = cleaning.multiprocessing(results, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset.extend(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "13404"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(testset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('Format Terbuka. Format Terbuka Ialah Suatu Format Fail Untuk Tujuan Menyimpan Data Digital Di Mana Format Ini Ditakrifkan Berdasarkan Spesifikasi Yang Diterbitkan Dan Dikendalikan Pertubuhan Piawaian Serta Boleh Digunapakai Khalayak Ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('Format Terbuka. Format Terbuka Ialah Suatu Format Fail Untuk Tujuan Menyimpan Data Digital, Di Mana Format Ini Ditakrifkan Berdasarkan Spesifikasi Yang Diterbitkan Dan Dikendalikan Pertubuhan Piawaian, Serta Boleh Digunapakai Khalayak Ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('Format terbuka. Format Terbuka ialah suatu format fail Untuk Tujuan Menyimpan Data digital, di Mana format ini ditakrifkan Berdasarkan spesifikasi yang Diterbitkan Dan Dikendalikan Pertubuhan Piawaian, serta Boleh Digunapakai khalayak ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('Format Terbuka. Format Terbuka Ialah Suatu format Fail untuk Tujuan menyimpan Data digital, Di Mana format Ini Ditakrifkan Berdasarkan spesifikasi Yang diterbitkan dan Dikendalikan pertubuhan Piawaian, Serta Boleh digunapakai khalayak ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('format terbuka. format terbuka ialah suatu format fail untuk tujuan< menyimpan data digital, di mana? format% ini ditakrifkan berdasarkan spesifikasi yang} diterbitkan? dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('FORMAT TERBUKA FORMAT TERBUKA IALAH SUATU FORMAT FAIL UNTUK TUJUAN MENYIMPAN DATA DIGITAL DI MANA FORMAT INI DITAKRIFKAN BERDASARKAN SPESIFIKASI YANG DITERBITKAN DAN DIKENDALIKAN PERTUBUHAN PIAWAIAN SERTA BOLEH DIGUNAPAKAI KHALAYAK RAMAI',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('Format Terbuka. Format TERBUKA Ialah SUATU FORMAT FAIL UNTUK Tujuan Menyimpan Data Digital, Di Mana Format INI Ditakrifkan BERDASARKAN SPESIFIKASI Yang DITERBITKAN Dan DIKENDALIKAN PERTUBUHAN PIAWAIAN, Serta Boleh Digunapakai Khalayak Ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('Format Terbuka. Format Terbuka Ialah Suatu. Format> Fail Untuk% Tujuan Menyimpan Data Digital, Di\" Mana Format: Ini Ditakrifkan) Berdasarkan Spesifikasi Yang Diterbitkan Dan{ Dikendalikan Pertubuhan Piawaian, Serta: Boleh Digunapakai Khalayak Ramai.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('FORMAT TERBUKA. FORMAT TERBUKA IALAH SUATU FORMAT FAIL UNTUK TUJUAN MENYIMPAN DATA DIGITAL, DI MANA FORMAT INI DITAKRIFKAN BERDASARKAN SPESIFIKASI YANG DITERBITKAN DAN DIKENDALIKAN PERTUBUHAN PIAWAIAN , SERTA BOLEH DIGUNAPAKAI KHALAYAK RAMAI .',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.'),\n",
       " ('Format TERBUKA. Format TERBUKA IALAH SUATU Format FAIL UNTUK Tujuan Menyimpan DATA DIGITAL, Di MANA FORMAT INI Ditakrifkan BERDASARKAN Spesifikasi YANG Diterbitkan DAN Dikendalikan PERTUBUHAN PIAWAIAN, Serta BOLEH Digunapakai KHALAYAK RAMAI.',\n",
       "  'Format terbuka. Format terbuka ialah suatu format fail untuk tujuan menyimpan data digital, di mana format ini ditakrifkan berdasarkan spesifikasi yang diterbitkan dan dikendalikan pertubuhan piawaian, serta boleh digunapakai khalayak ramai.')]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "testset[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_short(string):\n",
    "    splitted = string.split()\n",
    "    random_length = random.randint(2, min(len(splitted), 20))\n",
    "    end = random.randint(0 + random_length, len(splitted))\n",
    "    return ' '.join(splitted[end - random_length: end])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2037249"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open(files[0]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = [i for i in data if len(i) >= 2]\n",
    "\n",
    "len(data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = random.sample(data, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        try:\n",
    "            p = package(generate_short(strings[i]))\n",
    "            results.extend(p)\n",
    "        except:\n",
    "            pass\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  0%|          | 0/6 [00:00<?, ?it/s]00.14it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 837.63it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 1229.46it/s]\n",
      "  0%|          | 0/6 [00:00<?, ?it/s]98.18it/s]\n",
      "100%|██████████| 4/4 [00:00<00:00, 770.48it/s]]\n",
      "100%|██████████| 6/6 [00:00<00:00, 734.25it/s]\n",
      "\n",
      "\n",
      "\n",
      "\n",
      "\n",
      "\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 1049.98it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 718.31it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 213.90it/s]\n"
     ]
    }
   ],
   "source": [
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('Caixon\\\\ ialah komun di jabatan Hautes-Pyrenees di barat-daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('Caixon Ialah komun Di jabatan Hautes-Pyrenees di Barat-Daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('caixon ialah komun di jabatan hautes-pyrenees di barat-daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('Caixon Ialah Komun Di JABATAN HAUTES-PYRENEES Di Barat-Daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('CaiXoN IalAh KomUn Di JaBatan HaUtes-PYrEneES Di BaRAt-Daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('Caixon Ialah! Komun Di Jabatan Hautes-Pyrenees% Di Barat-Daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('CaIXoN IaLah KoMUN Di JaBAtan HautEs-PyreNEEs DI BaRat-DAyA',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('CAIXON ialah KOMUN DI jabatan Hautes-Pyrenees di BARAT-DAYA',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('Caixon Ialah Komun Di Jabatan Hautes-Pyrenees Di Barat-Daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya'),\n",
       " ('caixon ialah] komun, di{ jabatan hautes-pyrenees. di. barat-daya',\n",
       "  'Caixon ialah komun di jabatan Hautes-Pyrenees di barat-daya')]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results1[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset.extend(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(files[1]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = random.sample(data, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6/6 [00:00<00:00, 1529.47it/s]\n",
      "  0%|          | 0/4 [00:00<?, ?it/s]3.38it/s]]\n",
      "100%|██████████| 6/6 [00:00<00:00, 1443.24it/s]\n",
      "\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 858.02it/s]]\n",
      "\n",
      "\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 824.27it/s]\n",
      "\n",
      "100%|██████████| 4/4 [00:00<00:00, 1338.11it/s]\n",
      "\n",
      "\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 1146.51it/s]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset.extend(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "21525"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(testset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loop(strings):\n",
    "    results = []\n",
    "    for i in tqdm(range(len(strings))):\n",
    "        p = package(strings[i])\n",
    "        results.extend(p)\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(files[0]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = [i for i in data if len(i) >= 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6/6 [00:00<00:00, 961.37it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 1108.77it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 693.81it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 787.71it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 630.74it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 656.92it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 711.86it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 661.34it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 564.70it/s]\n",
      "\n",
      "\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 400.13it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 399.79it/s]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "data = random.sample(data, 100)\n",
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('SElaMA Ini, NizaM MenyembuNYikan KUmpulan INi UNtUk KepeNtIngaN DIRI SeTeLaH DIbubarkaN OLeh SharAmAN.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('selama ini , nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh sharaman.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('SELAMA Ini, NIZAM Menyembunyikan KUMPULAN Ini UNTUK KEPENTINGAN DIRI Setelah DIBUBARKAN Oleh Sharaman.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('selama ini, nizAm menyembUnYikAn kUMpulaN inI uNtuk kePentIngan Diri setelAH dIbubarkaN oleh SHarAmaN.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('SELAMA INI( NIZAM MENYEMBUNYIKAN KUMPULAN INI UNTUK KEPENTINGAN DIRI SETELAH DIBUBARKAN OLEH SHARAMAN}',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('Selama ini, Nizam menyembunyikan Kumpulan Ini untuk Kepentingan Diri Setelah dibubarkan Oleh Sharaman.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('Selama ini, Nizam: menyembunyikan( kumpulan< ini untuk kepentingan diri setelah, dibubarkan oleh Sharaman.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.'),\n",
       " ('SELAMA ini, NIZAM MENYEMBUNYIKAN kumpulan ini untuk KEPENTINGAN DIRI SETELAH DIBUBARKAN oleh SHARAMAN.',\n",
       "  'Selama ini, Nizam menyembunyikan kumpulan ini untuk kepentingan diri setelah dibubarkan oleh Sharaman.')]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results1[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset.extend(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 6/6 [00:00<00:00, 906.16it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 732.57it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 467.02it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 423.71it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 505.44it/s]\n",
      "\n",
      "\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 452.18it/s]\n",
      "100%|██████████| 6/6 [00:00<00:00, 296.26it/s]\n",
      "\n",
      "100%|██████████| 6/6 [00:00<00:00, 363.63it/s]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open(files[1]) as fopen:\n",
    "    data = list(filter(None, fopen.read().split('\\n')))\n",
    "    \n",
    "data = random.sample(data, 100)\n",
    "results1 = cleaning.multiprocessing(data, loop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('UnTuk MEmaHami SITuAsi seBenar, sAma Ada kitA BeNaR-Benar bAHAGiA atAu tiDak, mariLAH KITA menganaLisis pelbagAi fakTa dAn STatistIK berKAitAn gaya hiDup rAKyaT mAlaysiA.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('Untuk MEMAHAMI SITUASI SEBENAR, SAMA Ada KITA BENAR-BENAR Bahagia ATAU Tidak, Marilah KITA Menganalisis Pelbagai FAKTA DAN STATISTIK BERKAITAN Gaya Hidup RAKYAT Malaysia.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('Untuk; Memahami Situasi Sebenar, Sama Ada Kita Benar-Benar) Bahagia\" Atau\\' Tidak, Marilah Kita Menganalisis Pelbagai Fakta Dan Statistik Berkaitan\" Gaya Hidup Rakyat Malaysia.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('Untuk memahami situasi sebenar, sama ada% kita] benar-benar bahagia atau tidak, marilah kita: menganalisis pelbagai[ fakta( dan statistik berkaitan& gaya hidup rakyat Malaysia.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat malaysia.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " (\"UNTUK MEMAHAMI SITUASI SEBENAR, SAMA ADA KITA{ BENAR-BENAR BAHAGIA ATAU TIDAK, MARILAH KITA MENGANALISIS% PELBAGAI FAKTA DAN STATISTIK BERKAITAN' GAYA HIDUP} RAKYAT MALAYSIA.\",\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('Untuk memahami situasi sebenar> sama ada kita benar-benar bahagia atau tidak! marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia\"',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('UnTUk memaHami situaSi SeBenaR, samA AdA kitA benAr-benar bAhAgia AtaU tIdak, mArilah KiTA menganalISiS pElbagai faKta dAN sTaTisTik berKaitan Gaya hiDUP Rakyat MalAYsIA.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('Untuk memahami situasi sebenar[ sama ada kita benar-benar bahagia atau tidak: marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia\\\\',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.'),\n",
       " ('untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak , marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat malaysia.',\n",
       "  'Untuk memahami situasi sebenar, sama ada kita benar-benar bahagia atau tidak, marilah kita menganalisis pelbagai fakta dan statistik berkaitan gaya hidup rakyat Malaysia.')]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results1[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset.extend(results1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "32404"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(testset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "b2_application_key_id = os.environ['b2_application_key_id']\n",
    "b2_application_key = os.environ['b2_application_key']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "from b2sdk.v1 import *\n",
    "info = InMemoryAccountInfo()\n",
    "b2_api = B2Api(info)\n",
    "application_key_id = b2_application_key_id\n",
    "application_key = b2_application_key\n",
    "b2_api.authorize_account(\"production\", application_key_id, application_key)\n",
    "file_info = {'how': 'good-file'}\n",
    "b2_bucket = b2_api.get_bucket_by_name('malay-dataset')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "with open('test-set-true-case.json', 'w') as fopen:\n",
    "    json.dump(testset, fopen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<b2sdk.file_version.FileVersionInfo at 0x7fb75b99abe0>"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b2_bucket.upload_local_file(\n",
    "    local_file='test-set-true-case.json',\n",
    "    file_name='true-case/test-set-true-case.json',\n",
    "    file_infos=file_info,\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
